#ifndef PLOT_H
#define PLOT_H

#include <qwt_plot.h>
#include <qwt_interval.h>
#include <qwt_system_clock.h>
#include <qwt_plot_layout.h>
#include "colorplot.h"
#include <qwt_plot_canvas.h>
#include <qwt_painter.h>
#include <qwt_plot_grid.h>
#include <qwt_legend.h>
#include <qcolordialog.h>
#include <qevent.h>
#include <qwt_plot_directpainter.h>
#include <qwt_plot_curve.h>
#include <curvedata.h>
#include "globalvar.h"
#include <qwt_plot_scaleitem.h>
#include "binaryscaledraw.h"
#include <qwt_plot_legenditem.h>
class QwtPlotCurve;
class QwtPlotDirectPainter;
/**
 * @brief MIN_INTERVAL              Минимальное значение отображаемого интервала в сек (с 0 сек.)
 */
const double MIN_INTERVAL = MIN_INTERVAL_PLOT;
/**
 * @brief MAX_INTERVAL              Максимальное значение отображаемого интервала в сек (15 мин.)
 */
const double MAX_INTERVAL = MAX_INTERVAL_PLOT;

/**
 * @brief The Plot class            Класс для построения графика на виджете
 */
class Plot: public QwtPlot
{
    Q_OBJECT
public:
    explicit Plot(QWidget * = NULL);
    virtual ~Plot();
    /**
     * @brief start                 Запуск таймера для обновления графика
     */
    void start();
    /**
     * @brief replot                Перестроение плота
     */
    virtual void replot();
    /**
     * @brief eventFilter           Фильтр событий. Назначает для каждой кривой цвет
     * @return
     */
    virtual bool eventFilter(QObject *, QEvent *);
    /**
     * @brief clearCurves           Удаление кривых с плота
     */
    void clearCurves();
    /**
     * @brief addCurve              Добавление кривых на плот
     * @param xData                 Координаты точек X
     * @param yData                 Координаты точек Y
     * @param size                  Количество точек
     */
    void addCurves(int params);
    /**
     * @brief decrementInterval     Уменьшение длины интервала
     */
    void decrementInterval();
    /**
     * @brief setCanvasColor        Назначение цвета фона
     */
    void setCanvasColor();

    void killTimer();


public Q_SLOTS:
    /**
     * @brief setIntervalLength     Назначение длины интервала по оси X
     */
    void setIntervalLength(double interval = (MAX_INTERVAL-MIN_INTERVAL));
    /**
     * @brief setTheme              Назначение темы
     */
    void setTheme(int);
protected:
    /**
     * @brief showEvent             Событие для отображения виджета на экране
     */
    virtual void showEvent(QShowEvent *);
    /**
     * @brief resizeEvent           Событие для изменения размера виджета
     */
    virtual void resizeEvent(QResizeEvent *);
    /**
     * @brief timerEvent            Событие таймера для обновления кривых и увеличения длины интервала
     */
    virtual void timerEvent(QTimerEvent *);


private:
    /**
     * @brief updateCurveColor      Обновление цвета кривых
     */
    void updateCurveColor();
    /**
     * @brief updateCurve           Обновление кривых
     */
    void updateCurve();
    /**
     * @brief incrementInterval     Увеличение длины интервала
     */
    void incrementInterval();

    /**
     * @brief d_colors              Цвета фона плота и кривых
     */
    ColorPlot *d_colors;


    /**
     * @brief d_paintedPoints       Количество нарисованных точек
     */
    int d_paintedPoints;

    QVector<int> VectorPaintedPoints;


    /**
     * @brief d_directPainter       Отображаемая область
     */
    QwtPlotDirectPainter *d_directPainter;

    /**
     * @brief d_interval            Отображаемый интервал
     */
    QwtInterval d_interval;

    /**
     * @brief d_timerId             Номер таймера
     */
    int d_timerId;
    /**
     * @brief d_clock               Таймер прошедшего времени
     */
    QwtSystemClock d_clock;
    /**
     * @brief d_theme               Номер темы
     */
    int d_theme;
    /**
     * @brief d_curves              Вектор со всеми кривыми
     */
    QVector<QwtPlotCurve *> d_curves;
};

#endif // PLOT_H
